package thread;

public class ThreadDemo11 {
    public static long result=0;

    public static void main(String[] args) throws InterruptedException {
        Thread t=new Thread(()->{
         long tmp=0;
            for(long i=0;i<50_0000_0000L;i++)
            {
                tmp+=i;
            }
            result+=tmp;
        });
        Thread t2=new Thread(()->{
            long tmp=0;
            //            try {
//                // 如果把 join 加到末尾, 这个时候, 就还是 t 和 t2 并发执行, 没啥区别
//                // 如果把 join 加到开头, 这个时候, 就是先执行 t, t2 先阻塞. 等到 t 执行完了之后, t2 继续执行. 又成了串行执行了.
//                t.join();
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
            for(long i=50_0000_0001L;i<100_0000_0000L;i++)
            {
                tmp+=i;
            }
            result+=tmp;
        });
         long start = System.currentTimeMillis();
        t.start();
        t2.start();
        // 主要就是不知道 t 线程要执行多久
        // Thread.sleep(1000);

        // 使用 join, 就会严格按照 t 线程执行结束来作为等待的条件.
        // 什么时候 t 运行结束(计算完毕), 什么时候, join 就结束等待
        // t 运行 1ms, join 就等待 1ms; t 运行 10s, join 就等待 10s
        // 确保 join 之后得到的结果, 一定是靠谱的结果.
        t.join();
        t2.join();
        long end=System.currentTimeMillis();
        long time=end-start;
        System.out.println("start-end:"+(end-start)+"ms");
        System.out.println("reslut:"+result);
        long result1=0;
        start=System.currentTimeMillis();
        for(long i=0;i<100_0000_0000L;i++)
        {
            result1+=i;
        }

        end=System.currentTimeMillis();
        System.out.println("start-end:"+(end-start)+"ms");
        System.out.println("reslut1:"+result1);
    }
}
